package learn.up.java.thread.threads;

/**
 *yield() 在某些情况下让出CPU资源，暂停当前正在执行的线程对象，并执行其他线程，让给其它线程执行；
 *注意，如果存在synchronized线程同步的话，线程让步不会释放锁(监视器对象)。
 *sleep() 线程睡眠的过程中，如果是在synchronized线程同步内，是持有锁(监视器对象)的，也就是说，线程
 *是关门睡觉的，别的线程进不来，
 *join() 线程合并; 线程合并是优先执行调用该方法的线程，再执行当前线程
 * @author NANUTO
 * @date 2017年12月10日 下午3:49:20
 */
public class InterruptTest {

	public static void main(String[] args) {
		MyThread thread = new MyThread("mythread1");
//		ExecutorService pool  = Executors.newFixedThreadPool(3);
//		pool.execute(thread);
		thread.start();
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		//50s过后执行  interrupt()
		thread.interrupt();
		System.out.println(Thread.interrupted()+" "+Thread.currentThread().getName());
		/**
		 *  运行后，我们发现，线程t一直在执行，没有被中断，原来interrupt()是骗人的，汗！
		 *  其实interrupt()方法并不是中断线程的执行，而是为调用该方法的线程对象打上一个标记，
		 *  设置其中断状态为true，通过isInterrupted()方法可以得到这个线程状态，我们将上面的程序做一个小改动：
		 *  
		 *  另外，Thread.interrupted()方法是一个静态方法，它是判断当前线程的中断状态，需要注意的是，
		 *  线程的中断状态会由该方法清除
		 */
	}
}
class MyThread extends Thread {

	public MyThread(String threadName) {
		this.setName(threadName);
	}
	@Override
	public void run() {
		/*while (true) {
			System.out.println("execute.......");
		}*/
		//改动为若该线程为中断，则继续执行
		System.out.println(Thread.interrupted()+" "+Thread.currentThread().getName());
		while (! this.isInterrupted()) {
			System.out.println("execute.......");//线程被顺利的中断执行了
		}
		System.out.println(Thread.interrupted()+" "+Thread.currentThread().getName());
	}
	
}